/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package table.funcionario;

import java.text.ParseException;
import java.util.Date;
import java.util.List;
import javax.swing.table.AbstractTableModel;
import javax.swing.text.MaskFormatter;
import model.FuncionarioMODEL;
import model.LogradouroMODEL;
import table.Pair;
import table.TooltipCellRender;
import utilitarios.Data;
import utilitarios.Sexo;

/**
 *
 * @author Welisson
 */
public class FuncionarioTable extends AbstractTableModel {

    private static final int COL_ID = 0;
    private static final int COL_NOME = 1;
    private static final int COL_CPF = 2;
    private static final int COL_RG = 3;
    private static final int COL_NASC = 4;
    private static final int COL_SEXO = 5;
    private static final int COL_TEL_CEL = 6;
    private static final int COL_EMAIL = 7;
    private static final int COL_CEP = 8;
    private static final int COL_RUA = 9;
    private static final int COL_BAIRRO = 10;
    private static final int COL_CIDADE = 11;
    private static final int COL_UF = 12;
    private static final int COL_NUM = 13;
    private List<FuncionarioMODEL> funcionarios;
    private List<LogradouroMODEL> log;
    private TooltipCellRender renderer = new TooltipCellRender();   

    public FuncionarioTable(List<FuncionarioMODEL> funcionarios, List<LogradouroMODEL> logradouro) {
        this.funcionarios = funcionarios;
        log = logradouro;
    }

    @Override
    public int getRowCount() {
        return funcionarios.size();
    }

    @Override
    public int getColumnCount() {
        return 14;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        FuncionarioMODEL func = funcionarios.get(rowIndex);
        
        if (columnIndex == COL_ID) {
            return new Pair<Integer, Integer>(func.getId(), func.getId());  
        } else if (columnIndex == COL_NOME) {
            return new Pair<String, String>(func.getNome(), func.getNome());  
//            return func.getNome();
        } else if (columnIndex == COL_CPF) {
            return new Pair<String, String>(func.getCpf(), func.getCpf());  
        } else if (columnIndex == COL_RG) {
            return new Pair<String, String>(func.getRg(), func.getRg());  
        } else if (columnIndex == COL_NASC) {
            return new Pair<String, String>(Data.dateToString(func.getNasc()), Data.dateToString(func.getNasc()));  
        } else if (columnIndex == COL_SEXO) {
            return new Pair<String, String>(Sexo.letraToSexo(func.getSexo()), Sexo.letraToSexo(func.getSexo()));  
        } else if (columnIndex == COL_TEL_CEL) {
            return new Pair<String, String>(func.getTelCel(), func.getTelCel());  
        } else if (columnIndex == COL_EMAIL) {
            List<String> email = func.getEmail();
            return new Pair<String, String>(email.get(0), email.get(0));  
        } else if (columnIndex == COL_CEP) {
            return new Pair<String, String>(format("#####-###", func.getCep()), format("#####-###", func.getCep()));  
        } else if (columnIndex == COL_RUA) {
            return new Pair<String, String>(log.get(rowIndex).getEndereco(), log.get(rowIndex).getEndereco());
        } else if (columnIndex == COL_BAIRRO) {
            return new Pair<String, String>(log.get(rowIndex).getBairro(), log.get(rowIndex).getBairro());  
        } else if (columnIndex == COL_CIDADE) {
            return new Pair<String, String>(log.get(rowIndex).getCidade(), log.get(rowIndex).getCidade());  
        } else if (columnIndex == COL_UF) {
            return new Pair<String, String>(log.get(rowIndex).getUf(), log.get(rowIndex).getUf());  
        } else if (columnIndex == COL_NUM) {
            return new Pair<Integer, Integer>(func.getNum(), func.getNum());  
        }

        return null;
    }

    @Override
    public String getColumnName(int column) {
        String coluna = "";
        switch (column) {
            case COL_ID:
                coluna = "Cód.";
                break;
            case COL_NOME:
                coluna = "Nome";
                break;
            case COL_CPF:
                coluna = "CPF";
                break;
            case COL_RG:
                coluna = "RG";
                break;
            case COL_NASC:
                coluna = "Nascimento";
                break;
            case COL_SEXO:
                coluna = "Sexo";
                break;
            case COL_TEL_CEL:
                coluna = "Celular";
                break;
            case COL_EMAIL:
                coluna = "Email";
                break;
            case COL_CEP:
                coluna = "Cep";
                break;
            case COL_RUA:
                coluna = "Rua";
                break;
            case COL_BAIRRO:
                coluna = "Bairro";
                break;
            case COL_CIDADE:
                coluna = "Cidade";
                break;
            case COL_UF:
                coluna = "UF";
                break;
            case COL_NUM:
                coluna = "Número";
                break;
            default:
                throw new IllegalArgumentException("Coluna Inválida");
        }
        return coluna;
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        if (columnIndex == COL_ID) {
            return int.class;
        } else if (columnIndex == COL_NOME) {
            return String.class;
        } else if (columnIndex == COL_CPF) {
            return String.class;
        } else if (columnIndex == COL_RG) {
            return String.class;
        } else if (columnIndex == COL_NASC) {
            return Date.class;
        } else if (columnIndex == COL_SEXO) {
            return String.class;
        } else if (columnIndex == COL_TEL_CEL) {
            return String.class;
        } else if (columnIndex == COL_EMAIL) {
            return String.class;
        } else if (columnIndex == COL_CEP) {
            return String.class;
        } else if (columnIndex == COL_RUA) {
            return String.class;
        } else if (columnIndex == COL_BAIRRO) {
            return String.class;
        } else if (columnIndex == COL_CIDADE) {
            return String.class;
        } else if (columnIndex == COL_UF) {
            return String.class;
        } else if (columnIndex == COL_NUM) {
            return int.class;
        }
        return null;
    }

    public FuncionarioMODEL get(int row) {
        return funcionarios.get(row);
    }
    
    public Object get(int rowIndex, int columnIndex) {
        FuncionarioMODEL func = funcionarios.get(rowIndex);
        
        if (columnIndex == COL_ID) {
            return func.getId();
        } else if (columnIndex == COL_NOME) {
            return func.getNome();  
//            return func.getNome();
        } else if (columnIndex == COL_CPF) {
            return func.getCpf();  
        } else if (columnIndex == COL_RG) {
            return func.getRg();  
        } else if (columnIndex == COL_NASC) {
            return Data.dateToString(func.getNasc());  
        } else if (columnIndex == COL_SEXO) {
            return Sexo.letraToSexo(func.getSexo());  
        } else if (columnIndex == COL_TEL_CEL) {
            return func.getTelCel();  
        } else if (columnIndex == COL_EMAIL) {
            List<String> email = func.getEmail();
            return email.get(0);  
        } else if (columnIndex == COL_CEP) {
            return format("#####-###", func.getCep());  
        } else if (columnIndex == COL_RUA) {
            return log.get(rowIndex).getEndereco();
        } else if (columnIndex == COL_BAIRRO) {
            return log.get(rowIndex).getBairro();  
        } else if (columnIndex == COL_CIDADE) {
            return log.get(rowIndex).getCidade();  
        } else if (columnIndex == COL_UF) {
            return log.get(rowIndex).getUf();  
        } else if (columnIndex == COL_NUM) {
            return func.getNum();  
        }

        return null;
    }

    // Adiciona o sócio especificado ao modelo
    public void addFuncionario(FuncionarioMODEL funcionario, LogradouroMODEL logradouro) {
        // Adiciona o registro.
        this.funcionarios.add(funcionario);
        this.log.add(logradouro);
        // Pega a quantidade de registros e subtrai 1 para
        // achar o último índice. A subtração é necessária
        // porque os índices começam em zero.
        int ultimoIndice = getRowCount() - 1;

        // Notifica a mudança.
        fireTableRowsInserted(ultimoIndice, ultimoIndice);
    }

    public void updateFuncionario(int indiceLinha, FuncionarioMODEL funcionario) {
        this.funcionarios.set(indiceLinha, funcionario);
        fireTableRowsUpdated(indiceLinha, indiceLinha);
    }

    // Remove o sócio da linha especificada.
    public void removeFuncionario(int indiceLinha) {
        // Remove o registro.
        funcionarios.remove(indiceLinha);

        // Notifica a mudança.
        fireTableRowsDeleted(indiceLinha, indiceLinha);
    }
    
    
    private String format(String pattern, Object value) {
        MaskFormatter mask;
        try {
            mask = new MaskFormatter(pattern);
            mask.setValueContainsLiteralCharacters(false);
            return mask.valueToString(value);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }
    
    
}
